package main

import "fmt"

// AbstractBanker 满足开闭原则
// 抽象的银行业务员
type AbstractBanker interface {
	DoBus() //抽象的处理业务接口
}

// SaveBanker 存款的业务员
type SaveBanker struct {
	// 存款的业务员 抽象的业务员
}

func (s *SaveBanker) DoBus() {
	// 实现存款业务
	fmt.Println("进行了 存款...")
}

// TransferBanker 转账的业务员
type TransferBanker struct {
}

func (t *TransferBanker) DoBus() {
	//实现转账业务
	fmt.Println("进行了 转账业务...")
}

// StackBanker 股票的业务员
type StackBanker struct {
}

func (sb *StackBanker) DoBus() {
	// 实现股票的业务
	fmt.Println("进行了 股票的业务...")
}

// 实现一个架构层（基于抽象层进行业务封装-针对interface接口进行封装)
func BankerBusiness(banker AbstractBanker) {
	//通过接口向下调用 （多态的现象）
	banker.DoBus()
}

func main() {
	//存款的业务
	//sb := SaveBanker{}
	//sb.DoBus()

	//转账的业务
	//st := TransferBanker{}
	//st.DoBus()

	//股票的业务
	//stb := StackBanker{}
	//stb.DoBus()

	//存款业务
	BankerBusiness(&SaveBanker{})
	//转账的业务
	BankerBusiness(&TransferBanker{})
	//股票的业务
	BankerBusiness(&StackBanker{})
}
